use crate::serial::{basic, SerialReceiver, ConnectSerialConfig};
use tokio::sync::mpsc;

///
/// ###串口集成方法
///
/// ----
///
/// 参数:
/// - path 串口路径名称 例如 COM3
/// - BAUD_RATE 波特率 例如 9600
/// - timeout_millis 串口链接的超时时间 毫秒为单位
/// - delay_millis 单次读取的延时时间 毫秒为单位
/// 如果单次读取超过该时长 会清除缓存重新读取 例如 10 (ms)
/// - buffer_size 缓冲区的长度
/// 如果读取到的长度不足且超时 则会用0填补剩余空间
/// - writer 向串口写入的信道收取者 简单说 需要外部创建信道并将收取者填入参数
/// - channel_cap 从串口返回的信道收取者的长度 例如 1024
///
/// ---
///
/// 返回值:\
/// `serialport::Result<Receiver<(usize, Box<[u8]>)>>`\
/// 从串口返回的数据 的信道收取者 信道长度依据参数做缓存
///
pub async fn connect_serial_port_async<'a>
(
    path: impl Into<std::borrow::Cow<'a, str>>,
    writer: mpsc::Receiver<Box<[u8]>>,
    csc: ConnectSerialConfig,
)
    -> serialport::Result<SerialReceiver>
{
    let port = basic::open(path, &csc)?;
    let port_clone = port.try_clone()?;
    basic::chant_async(port_clone, writer).await;
    let result = basic::listen_async(port, csc.buffer_size, csc.read_delay_millis, csc.reread_times).await;
    Ok(result)
}

#[cfg(test)]
mod tests {}